﻿using System;
using System.Data;
using System.IO;
using System.Windows.Forms;

namespace Operacional
{
    class PedeOrdemProd
    {
        #region "Declarações"

        public static DataView dvProducao;
        public static DataTable dtProducao;
        private OpenFileDialog _txtFile;
        readonly frmLinhas _linhas = new frmLinhas { MdiParent = Program.entrada };
        private TimeSpan _tempoparavirada;
        private DateTime _horaprevista, _inicio;
        private string _numLinha;

        #endregion

        public PedeOrdemProd()
        {            
            if (string.IsNullOrEmpty(Properties.Settings.Default.fileProd) || !File.Exists(Properties.Settings.Default.fileProd))
                ask4File();

            if (Properties.Settings.Default.fileProd != "" & File.Exists(Properties.Settings.Default.fileProd))
            {
                #region Preenche Tabela Ordens Prod. com base no ficheiro OPRODUCAO
                dtProducao = new DataTable();
                dtProducao.Clear();

                string[] linhas = File.ReadAllLines(Properties.Settings.Default.fileProd);
                //Colunas
                String[] cols = linhas[0].Split(';');
                foreach (String col in cols) dtProducao.Columns.Add(col);

                //Linhas
                dtProducao.BeginLoadData();
                for (int l = 1; l < linhas.Length; l++)
                {
                    DataRow row = dtProducao.NewRow();
                    row.ItemArray = linhas[l].Split(';');
                    dtProducao.Rows.Add(row);
                }
                dtProducao.EndLoadData();
                #endregion

                dvProducao = dtProducao.DefaultView;
            }
        }

        public void mostraProducao()
        {
            _numLinha = frmLinhas.numLinha;            

            InputBox.Numerico = true;
            InputBoxResult input = InputBox.Show("Insira o nº da Ordem de Produção:", "");

            if (!string.IsNullOrEmpty(input.Text))
            {
                dvProducao.RowFilter = string.Format("[LINHA] = '{0}' and [N.O.PRODUCAO] = '{1}'", _numLinha, input.Text);

                if (dvProducao.Count > 0)
                {
                    frmProducao producao = new frmProducao { MdiParent = Program.entrada };
                    producao.Show();
                }
                else
                {
                    MessageBox.Show(@"Não existe essa Ordem de Produção para a Linha escolhida", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    _linhas.Show();
                }
            }
            else
            { _linhas.Show(); }

        }

        public string calculaTempoVirada()
        {
            _numLinha = frmLinhas.numLinha;
            
            #region "Gets production number"
            
            frmLinhas.dvLinhasTarefas.RowFilter = string.Format("[LINHA] = '{0}' and [Estado]= 'Em Producao'", _numLinha);
            
            dvProducao.RowFilter = string.Format("[LINHA] = '{0}' and (N.O.PRODUCAO='{1}')", _numLinha,
                frmLinhas.dvLinhasTarefas[frmLinhas.dvLinhasTarefas.Count - 1][7].ToString().Substring(1, 12));

            string numOrdemProd = dvProducao[0][0].ToString();
            #endregion

            dvProducao.RowFilter = string.Format("[LINHA] = '{0}' and [N.O.PRODUCAO] = '{1}'", _numLinha, numOrdemProd);

            double tempovirada = Convert.ToDouble(dvProducao[0][14].ToString());

            frmLinhas.dvLinhasTarefas.RowFilter = string.Format("[Linha] = {0}", _numLinha);
            _inicio = Convert.ToDateTime(frmLinhas.dvLinhasTarefas[frmLinhas.dvLinhasTarefas.Count - 1]["Data"].ToString());

            _horaprevista = _inicio.AddMinutes(tempovirada);
            _tempoparavirada = _horaprevista.Subtract(DateTime.Now);

            if (Convert.ToInt32(_tempoparavirada.TotalMinutes) < 0)
                _tempoparavirada = ajustatempovirada(tempovirada).Subtract(DateTime.Now);

            if (_tempoparavirada.TotalMinutes.ToString("0") == "0")
                return "1\n" + _horaprevista.ToString("HH:mm");

            return _tempoparavirada.TotalMinutes.ToString("0") + "\n" + _horaprevista.ToString("HH:mm");
        }

        private DateTime ajustatempovirada(double tempopvirada)
        {
            _horaprevista = _horaprevista.AddMinutes(tempopvirada);
            if (DateTime.Now.Ticks >= _horaprevista.Ticks)
                ajustatempovirada(tempopvirada);
            
            return _horaprevista;
        }

        private void ask4File()
        {
            _txtFile = new OpenFileDialog
            {
                Filter = @"Ficheiro de Texto (*.txt)|*.txt|Vírgula Flutuante (*.csv)|*.csv",
                Title = @"Seleccione por favor o ficheiro de Ordens de Produção"
            };

            if (_txtFile.ShowDialog() != DialogResult.OK) return;
            Properties.Settings.Default.fileProd = _txtFile.FileName;
            Properties.Settings.Default.Save();
        }
    }
}
